home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d8 / pdriver5.arc / PKTCHK.ASM < prev    next >
Assembly Source File  |  1989-12-17  |  7KB  |  344 lines

  1. ;  Russell Nelson, Clarkson University.  October 20, 1988
  2. ;  Copyright, 1988, 1989, Russell Nelson
  3. ;  Modified TERMIN.ASM to be CHKPKT.ASM return errorlevel, don't terminate
  4. ;    07/24/89 Glen Marianko, Albert Einstein College of Medicine
  5.  
  6. ;   This program is free software; you can redistribute it and/or modify
  7. ;   it under the terms of the GNU General Public License as published by
  8. ;   the Free Software Foundation, version 1.
  9. ;
  10. ;   This program is distributed in the hope that it will be useful,
  11. ;   but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ;   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. ;   GNU General Public License for more details.
  14. ;
  15. ;   You should have received a copy of the GNU General Public License
  16. ;   along with this program; if not, write to the Free Software
  17. ;   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  
  19. segmoffs    struc
  20. offs        dw    ?
  21. segm            dw    ?
  22. segmoffs    ends
  23.  
  24. HT    equ    09h
  25. CR    equ    0dh
  26. LF    equ    0ah
  27.  
  28. code    segment byte public
  29.     assume    cs:code, ds:code
  30.  
  31.     org    80h
  32. phd_dioa    label    byte
  33.  
  34.     org    100h
  35. start:
  36.     jmp    start_1
  37.  
  38. their_isr    dd    ?
  39. packet_int_no    db    0,0
  40.         db    0,0        ; filler for print_number
  41. packet_int_end  db    0,0
  42. signature    db    'PKT DRVR',0
  43. signature_len    equ    $-signature
  44. got_int        db    0
  45. no_signature_msg    db    "Packet driver not found.",CR,LF,'$'
  46. signature_msg    db    "Packet driver found at ",'$'
  47. no_signatures_msg    db    "No packet driver found in specified range.",CR,LF,'$'
  48. usage_msg    db    "usage: chkpkt <packet_int_no> (packet_int_no_end)",CR,LF,'$'
  49.  
  50. usage_error:
  51.     mov    dx,offset usage_msg
  52. error:
  53.     mov    ah,9
  54.     int    21h
  55. err_quit:
  56.     mov    al,1
  57.         mov     ah,04ch                 ; exit with errorlevel 1
  58.         int     21h
  59.  
  60. start_1:
  61.     mov    si,offset phd_dioa+1
  62.     call    skip_blanks
  63.     cmp    al,CR            ;end of line?
  64.     je    usage_error
  65.  
  66.     mov    di,offset packet_int_no
  67.     call    get_number
  68.     cmp    packet_int_no+1,0
  69.     jne    usage_error
  70.  
  71.     mov    di,offset packet_int_end
  72.     call    get_number
  73.     cmp    packet_int_end+1,0
  74.     jne    usage_error
  75.     mov    di,si
  76.     call    skip_blanks
  77.     cmp    al,CR            ;end of line?
  78.     jne    usage_error
  79.  
  80.     cmp    packet_int_end,0
  81.     jne    chk_range        ; second arg specified
  82.  
  83.     call    chk_int
  84.     jne    no_signature_err
  85.     call    pkt_found
  86. done:
  87.     mov    al,0
  88.     mov    ah,04ch
  89.     int    21h            ; exit with errorlevel 0
  90.  
  91. no_signature_err:
  92.     mov    dx,offset no_signature_msg
  93.     jmp    error
  94.  
  95. chk_range:
  96.     mov    al,packet_int_end
  97.     sub    al,packet_int_no
  98.     jc    usage_error
  99.  
  100. chk_loop:
  101.     call    chk_int
  102.     jne    chk_none
  103.     call    pkt_found
  104.     inc    got_int            ; flag we got one
  105. chk_none:
  106.     mov    al,packet_int_no
  107.     cmp    packet_int_end,al
  108.     jz    no_signatures_chk
  109.     inc    packet_int_no        ; increment
  110.     jmp    chk_loop
  111.  
  112. no_signatures_chk:
  113.     cmp    got_int,0
  114.     jnz    done
  115.  
  116. no_signatures:
  117.     mov    dx,offset no_signatures_msg
  118.     jmp    error
  119.  
  120.     public    chk_int
  121. chk_int:
  122.     mov    ah,35h            ;get their packet interrupt.
  123.     mov    al,packet_int_no
  124.     int    21h
  125.     mov    their_isr.offs,bx
  126.     mov    their_isr.segm,es
  127.     lea    di,3[bx]
  128.     mov    si,offset signature
  129.     mov    cx,signature_len
  130.     repe    cmpsb
  131.     ret
  132.  
  133.     public    pkt_found
  134. pkt_found:
  135.     mov    dx,offset signature_msg
  136.     mov    di,offset packet_int_no
  137.     jmp    print_number
  138.  
  139.     public    get_number
  140. get_number:
  141.     mov    bp,10            ;we default to 10.
  142.     jmp    short get_number_0
  143.  
  144.     public    get_hex
  145. get_hex:
  146.     mov    bp,16
  147. ;get a hex number from [si], skipping leading blanks.
  148. ;return cy if there are no digits at all.
  149. ;return nc, bx:cx = number, and store cx at [di]
  150. get_number_0:
  151.     call    skip_blanks
  152.     call    get_digit        ;is there really a number here?
  153.     jc    get_number_3
  154.     or    al,al            ;Does the number begin with zero?
  155.     jne    get_number_4        ;no.
  156.     mov    bp,8            ;yes - they want octal.
  157. get_number_4:
  158.  
  159.     xor    cx,cx            ;get a hex number.
  160.     xor    bx,bx
  161. get_number_1:
  162.     lodsb
  163.     cmp    al,'x'            ;did they really want hex?
  164.     je    get_number_5        ;yes.
  165.     cmp    al,'X'            ;did they really want hex?
  166.     je    get_number_5        ;yes.
  167.     call    get_digit        ;convert a character into an int.
  168.     jc    get_number_2        ;not a digit (neither hex nor dec).
  169.     xor    ah,ah
  170.     cmp    ax,bp            ;larger than our base?
  171.     jae    get_number_2        ;yes.
  172.  
  173.     push    ax            ;save the new digit.
  174.  
  175.     mov    ax,bp            ;multiply the low word by ten.
  176.     mul    cx
  177.     mov    cx,ax            ;keep the low word.
  178.     push    dx            ;save the high word for later.
  179.     mov    ax,bp
  180.     mul    bx
  181.     mov    bx,ax            ;we keep only the low word (which is our high word)
  182.     pop    dx
  183.     add    bx,ax            ;add the high result from earlier.
  184.  
  185.     pop    ax            ;get the new digit back.
  186.     add    cx,ax            ;add the new digit in.
  187.     adc    bx,0
  188.     jmp    get_number_1
  189. get_number_5:
  190.     mov    bp,16            ;change the base to hex.
  191.     jmp    get_number_1
  192. get_number_2:
  193.     dec    si
  194.     mov    [di],cx            ;store the parsed number.
  195.     clc
  196.     ret
  197. get_number_3:
  198.     stc
  199.     ret
  200.  
  201.  
  202.     public    skip_blanks
  203. skip_blanks:
  204.     lodsb                ;skip blanks.
  205.     cmp    al,' '
  206.     je    skip_blanks
  207.     cmp    al,HT
  208.     je    skip_blanks
  209.     dec    si
  210.     ret
  211.  
  212.  
  213. get_digit:
  214. ;enter with al = character
  215. ;return nc, al=digit, or cy if not a digit.
  216.     cmp    al,'0'            ;decimal digit?
  217.     jb    get_digit_1        ;no.
  218.     cmp    al,'9'            ;. .?
  219.     ja    get_digit_2        ;no.
  220.     sub    al,'0'
  221.     clc
  222.     ret
  223. get_digit_2:
  224.     or    al,20h
  225.     cmp    al,'a'            ;hex digit?
  226.     jb    get_digit_1
  227.     cmp    al,'f'            ;hex digit?
  228.     ja    get_digit_1
  229.     sub    al,'a'-10
  230.     clc
  231.     ret
  232. get_digit_1:
  233.     stc
  234.     ret
  235.  
  236. print_number:
  237. ;enter with dx -> dollar terminated name of number, di ->dword.
  238. ;exit with the number printed and the cursor advanced to the next line.
  239.     mov    ah,9            ;print the name of the number.
  240.     int    21h
  241.     mov    al,'0'
  242.     call    chrout
  243.     mov    al,'x'
  244.     call    chrout
  245.     mov    ax,[di]            ;print the number in hex.
  246.     mov    dx,[di+2]
  247.     call    hexout
  248.     mov    al,' '
  249.     call    chrout
  250.     mov    al,'('
  251.     call    chrout
  252.     mov    ax,[di]            ;print the number in decimal.
  253.     mov    dx,[di+2]
  254.     call    decout
  255.     mov    al,')'
  256.     call    chrout
  257.     mov    al,CR
  258.     call    chrout
  259.     mov    al,LF
  260.     call    chrout
  261.     ret
  262.  
  263.     public    hexout
  264. hexout:
  265.     mov    cl,'0'            ;prepare to eliminate leading zeroes.
  266.     xchg    ax,dx            ;just output 32 bits in hex.
  267.     call    wordout            ;output dx.
  268.     xchg    ax,dx
  269.     jmp    wordout            ;output ax.
  270.  
  271.     public    decout
  272. decout:
  273.     mov    si,ax            ;get the number where we want it.
  274.     mov    di,dx
  275.  
  276.     xor    ax,ax            ;start with all zeroes in al,bx,bp
  277.     mov    bx,ax
  278.     mov    bp,ax
  279.  
  280.     mov    cx,32            ;32 bits in two 16 bit registers.
  281. decout_1:
  282.     shl    si,1
  283.     rcl    di,1
  284.     xchg    bp,ax
  285.     call    addbit
  286.     xchg    bp,ax
  287.     xchg    bx,ax
  288.     call    addbit
  289.     xchg    bx,ax
  290.     adc    al,al
  291.     daa
  292.     loop    decout_1
  293.  
  294.     mov    cl,'0'            ;prepare to eliminate leading zeroes.
  295.     call    byteout            ;output the first two.
  296.     mov    ax,bx            ;output the next four
  297.     call    wordout            ;output the next four
  298.     mov    ax,bp
  299. wordout:
  300.     push    ax
  301.     mov    al,ah
  302.     call    byteout
  303.     pop    ax
  304. byteout:
  305.     mov    ah,al
  306.     shr    al,1
  307.     shr    al,1
  308.     shr    al,1
  309.     shr    al,1
  310.     call    digout
  311.     mov    al,ah
  312. digout:
  313.     and    al,0fh
  314.     add    al,90h    ;binary digit to ascii hex digit.
  315.     daa
  316.     adc    al,40h
  317.     daa
  318.     cmp    al,cl            ;leading zero?
  319.     je    return
  320.     mov    cl,-1            ;no more leading zeros.
  321. chrout:
  322.     push    ax            ;print the char in al.
  323.     xchg    al,dl
  324.     mov    ah,2
  325.     int    21h
  326.     xchg    al,dl
  327.     pop    ax
  328. return:
  329.     ret
  330.  
  331.  
  332. addbit:    adc    al,al
  333.     daa
  334.     xchg    al,ah
  335.     adc    al,al
  336.     daa
  337.     xchg    al,ah
  338.     ret
  339.  
  340.  
  341. code    ends
  342.  
  343.     end    start
  344.